﻿package com.hirokimo.display
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;

	/**
	 * BackgroundFiller 背景平铺器,可以用载入的图片平铺任意DisplayObject的背景.
	 * 该对象不能自动适应容器的尺寸,所以你需要在外部容器尺寸变化后重新调用resize方法
	 *
	 * @author	hirokimo
	 *
	 * @example
	 * 		<listing version="3.0">
	 *			var bg:Sprite = new Sprite();
	 *			addChild(bg);
	 *			var backgroundFiller:BackgroundFiller = new BackgroundFiller(bg,stage.stageWidth,stage.stageHeight);
	 *			backgroundFiller.init("bg.png");
	 * 		</listing>
	 */
	public class BackgroundFiller extends Sprite
	{

		private var shell:Sprite;
		private var w:int;
		private var h:int;
		private var w_single:int;
		private var h_single:int;
		private var bmpData:BitmapData;

		/**
		 * 构造函数
		 *
		 * @param _shell 需要平铺的容器Sprite
		 * @param _w 初始化平铺宽度
		 * @param _h 初始化平铺高度
		 */
		public function BackgroundFiller(_shell:Sprite, _w:int, _h:int)
		{
			shell=_shell;
			w=_w;
			h=_h;
		}

		/**
		 * 初始化,传入平铺图片路径.
		 *
		 * @param _path 平铺图像的路径
		 */
		public function init(_path:String):void
		{
			var backgroundsLoader:Loader=new Loader();
			backgroundsLoader.contentLoaderInfo.addEventListener(Event.INIT, __onBackgroundFillersLibraryLoaded);
			backgroundsLoader.load(new URLRequest(_path));
		}

		/**
		 * 更新平铺背景尺寸,需要自己在外部侦听.
		 *
		 * @param _w 平铺宽度
		 * @param _h 平铺高度
		 */
		public function resize(_w:int, _h:int):void
		{
			w=_w;
			h=_h;
			renderBackground();
		}

		private function __onBackgroundFillersLibraryLoaded(evt:Event):void
		{
			w_single=Math.ceil(evt.target.content.width);
			h_single=Math.ceil(evt.target.content.height);
			evt.target.removeEventListener(Event.INIT, __onBackgroundFillersLibraryLoaded);
			bmpData=new BitmapData(w_single, h_single);
			bmpData.draw(evt.target.content);
			renderBackground();
		}

		private function renderBackground():void
		{
			var graphic:Graphics=shell.graphics;
			graphic.clear();
			graphic.beginBitmapFill(bmpData);
			graphic.drawRect(0, 0, w, h);
			graphic.endFill();
		}
	}
}

